Hibernate এবং JPA (Java Persistence API) দুটি অত্যন্ত জনপ্রিয় প্রযুক্তি যা Java অ্যাপ্লিকেশনগুলিতে ডেটাবেসের সাথে যোগাযোগ এবং ডেটা পERSISTENCE (স্টোরেজ) এর কাজ সহজ করে তোলে। Hibernate হল একটি ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক, এবং JPA হল একটি স্পেসিফিকেশন যা ORM মডেল তৈরির জন্য স্ট্যান্ডার্ড নির্ধারণ করে। Hibernate এবং JPA অনেক ক্ষেত্রে একে অপরের সাথে কাজ করে, তবে তাদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে।
এখানে Hibernate এবং JPA এর মধ্যে সম্পর্ক এবং পার্থক্য, ব্যবহার, এবং তাদের মধ্যে কীভাবে কাজ করতে হয় তা ব্যাখ্যা করা হবে।
Feature | Hibernate | JPA (Java Persistence API) |
---|---|---|
Type | ORM Framework | API Specification |
Specification | Hibernate is an implementation of JPA | JPA is a specification for Object-Relational Mapping (ORM) |
Standardization | Not a specification, but a concrete implementation | JPA is a standard for ORM in Java |
Persistence Context | Hibernate Session is used to manage persistence | JPA uses EntityManager for persistence management |
Features | Includes advanced features beyond JPA | Provides only the basic functionality for ORM operations |
Integration | Works independently, although it can be used with JPA | JPA is used with different implementations like Hibernate, EclipseLink |
Cache | Supports first and second-level cache management | JPA defines cache specifications but leaves actual caching implementations to providers |
Annotations | Uses its own annotations alongside JPA annotations | JPA annotations are the standard annotations for ORM mappings |
Hibernate-কে JPA এর একটি বাস্তবায়ন (implementation) হিসেবে ব্যবহার করা যেতে পারে, এবং এটি JPA এর সমস্ত স্ট্যান্ডার্ড অনুসরণ করে। Hibernate ব্যবহার করলে, আপনি JPA স্পেসিফিকেশন অনুসরণ করে কোড লিখতে পারেন, তবে Hibernate তার নিজস্ব অতিরিক্ত বৈশিষ্ট্য যেমন caching, batch processing, এবং criteria queries প্রদান করে।
persistence.xml
:<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="myJPAUnit">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.example.Student</class>
<properties>
<!-- Hibernate Configuration -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
</properties>
</persistence-unit>
</persistence>
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Table(name = "student")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // Hibernate-specific feature
public class Student {
@Id
private int id;
private String name;
private String course;
// Getters and Setters
}
EntityManager
for Persistence:import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class StudentManager {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJPAUnit");
EntityManager em = emf.createEntityManager();
// Begin Transaction
em.getTransaction().begin();
// Persist a new Student
Student student = new Student();
student.setId(1);
student.setName("John Doe");
student.setCourse("Java");
em.persist(student);
// Commit Transaction
em.getTransaction().commit();
em.close();
emf.close();
}
}
JPA একটি স্ট্যান্ডার্ড স্পেসিফিকেশন হিসেবে কাজ করে, যার মানে হল যে আপনি JPA এর সাথে ডেটাবেস অপারেশন কোড লিখলে এটি বিভিন্ন ORM ফ্রেমওয়ার্কের সাথে কাজ করতে সক্ষম হয় (যেমন Hibernate, EclipseLink, OpenJPA ইত্যাদি)।
যেহেতু JPA একটি স্পেসিফিকেশন, এর সাথে লিখিত কোডটি সহজে Hibernate থেকে EclipseLink বা অন্য JPA কমপ্লায়েন্ট ফ্রেমওয়ার্কে স্যুইচ করা যায়, যদি ভবিষ্যতে কোনো কারণবশত ORM ফ্রেমওয়ার্ক পরিবর্তন করতে হয়।
Hibernate এর মতো JPA Implementation অধিকাংশ আধুনিক ফিচার যেমন second-level caching, batch processing, criteria queries ইত্যাদি প্রদান করে, যা JPA স্পেসিফিকেশন স্বয়ং সম্পূর্ণভাবে কভার করে না।
Hibernate প্রদান করে আরও কিছু অতিরিক্ত বৈশিষ্ট্য যেমন native SQL অথবা HQL (Hibernate Query Language), যা JPA স্পেসিফিকেশন এর বাইরে।
Feature | Hibernate | JPA (Java Persistence API) |
---|---|---|
Type | ORM Framework | API Specification |
Purpose | Implements JPA specification and provides advanced ORM features | A standard for ORM operations in Java |
Caching | Built-in caching mechanisms like first-level and second-level cache | JPA does not define caching implementations, but supports cache providers |
Fetch Strategies | Supports multiple fetch strategies (lazy, eager) | Fetch strategies are part of the specification, but implementations may differ |
Query Language | HQL (Hibernate Query Language) | JPQL (Java Persistence Query Language) |
Integration | Works independently as a standalone framework | Can be used with multiple ORM implementations (e.g., Hibernate, EclipseLink) |
Features | Advanced features like Criteria API, batch processing, and custom optimizations | Basic ORM capabilities without advanced features like batch processing |
Hibernate এবং JPA (Java Persistence API) দুটোই জাভা প্রযুক্তির অংশ, যা ডেটাবেসের সাথে অবজেক্ট-রিলেশনাল ম্যাপিং (ORM) সম্পর্কিত কার্যাবলী সহজ করার জন্য ব্যবহৃত হয়। যদিও দুটি প্রযুক্তি মূলত একই কাজ করে, তবুও তাদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে। নিচে এই পার্থক্যগুলি বিস্তারিতভাবে আলোচনা করা হলো।
Aspect | Hibernate | JPA |
---|---|---|
Definition | Hibernate একটি ORM ফ্রেমওয়ার্ক যা JPA স্পেসিফিকেশন অনুসরণ করে। | JPA একটি specification যা ORM ডেটাবেস অপারেশনকে স্ট্যান্ডার্ডভাবে নির্ধারণ করে। |
Standardization | Hibernate JPA স্পেসিফিকেশন অনুসরণ করলেও এটি একটি নিজস্ব ফ্রেমওয়ার্ক। | JPA একটি standard specification, যা Hibernate সহ অন্য ORM ফ্রেমওয়ার্কের জন্য স্ট্যান্ডার্ড প্রদান করে। |
Features | Hibernate অনেক অতিরিক্ত ফিচার সরবরাহ করে (HQL, Criteria API, Batch Processing, Second-level Cache)। | JPA শুধুমাত্র standard interfaces প্রদান করে এবং Hibernate-এর তুলনায় কিছু কম ফিচার থাকে। |
Configuration | Hibernate কনফিগারেশন ফাইল hibernate.cfg.xml অথবা Java config। | JPA কনফিগারেশন ফাইল persistence.xml অথবা Java config। |
Portability | Hibernate ডেটাবেস নিরপেক্ষ এবং অনেক ধরনের ডেটাবেস সিস্টেমে কাজ করে। | JPA ডেটাবেস নিরপেক্ষ, তবে এটি Java EE স্পেসিফিকেশন এবং একাধিক JPA ইমপ্লিমেন্টেশন যেমন Hibernate, EclipseLink সমর্থন করে। |
Query Language | Hibernate HQL (Hibernate Query Language) ব্যবহার করে। | JPA JPQL (Java Persistence Query Language) ব্যবহার করে। |
Cache | Hibernate second-level cache এবং query cache সরবরাহ করে। | JPA সঠিকভাবে কেচিংয়ের জন্য কোনো সরাসরি সমর্থন দেয় না, তবে JPA ইমপ্লিমেন্টেশন ক্যাশিং সাপোর্ট করতে পারে। |
Custom Features | Hibernate অনেক কাস্টম ফিচার সরবরাহ করে যেমন batch processing, multi-tenancy, native SQL। | JPA একটি স্ট্যান্ডার্ড স্পেসিফিকেশন, যা কাস্টম ফিচার সমর্থন করে না, তবে JPA ইমপ্লিমেন্টেশন (যেমন Hibernate) এর মাধ্যমে এটি করা সম্ভব। |
Hibernate সাধারণত যখন আপনি একটি পূর্ণাঙ্গ ORM সিস্টেম চান এবং এর additional features প্রয়োজন হয় তখন ব্যবহৃত হয়। তবে, JPA ব্যবহার করার মাধ্যমে আপনি portability অর্জন করতে পারেন এবং এটি একটি স্ট্যান্ডার্ড স্পেসিফিকেশন হিসেবে ডেটাবেস অপারেশনগুলির জন্য আরো অ্যাবস্ট্র্যাকশন প্রদান করে।
JPA (Java Persistence API) হল একটি Java API যা object-relational mapping (ORM) এর জন্য ডিজাইন করা হয়েছে, এবং এটি Java অ্যাপ্লিকেশনগুলিতে ডেটাবেসের সাথে যোগাযোগ করার জন্য একটি স্ট্যান্ডার্ড প্রদান করে। Hibernate হল একটি JPA implementation যা ORM এর মাধ্যমে ডেটাবেসের সাথে যোগাযোগ সহজ করে তোলে। JPA এবং Hibernate একই উদ্দেশ্য সাধন করে, তবে JPA একটি specification (বিশেষজ্ঞতা) এবং Hibernate হল তার একটি implementation।
Hibernate-কে JPA ব্যবহার করে কাজ করতে সক্ষম করতে, আপনি JPA annotations ব্যবহার করবেন, যা Hibernate ক্যাশিং, transaction management, এবং persistence context-সহ ডেটাবেস অপারেশনগুলিকে সহজতর করবে। Hibernate জিপিএ (JPA) স্পেসিফিকেশন অনুসরণ করে এবং ডেটাবেসের সাথে সম্পর্কিত কার্যক্রম পরিচালনা করে।
Hibernate এর সাথে JPA ব্যবহার করতে হলে, আপনার কিছু বিশেষ সেটিংস এবং অ্যানোটেশন ব্যবহার করতে হবে। এখানে আমরা Hibernate ব্যবহার করে JPA কনফিগারেশন এবং annotations সহ একটি entity management সিস্টেম তৈরি করব।
Hibernate কনফিগারেশন ফাইলে, JPA এর জন্য প্রয়োজনীয় কিছু প্রপার্টি কনফিগার করতে হবে। এখানে Hibernate কে JPA স্পেসিফিকেশন অনুসরণ করতে বলা হবে এবং ডেটাবেস সংযোগের জন্য প্রপার্টি সরবরাহ করতে হবে।
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:mem:testdb</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<!-- Hibernate dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- Enable JPA -->
<property name="hibernate.jpa.jdbc.batch_size">30</property>
<!-- Show SQL Queries -->
<property name="hibernate.show_sql">true</property>
<!-- Hibernate HBM2DDL -->
<property name="hibernate.hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
এখানে:
update
সেট করা হয়েছে।JPA এর সাথে Hibernate ব্যবহার করতে হলে, @Entity এবং @Table এনোটেশন ব্যবহার করা হয়। এই এনোটেশনগুলি Hibernate কে বলে দেয় যে এটি একটি Entity Class এবং এটি ডেটাবেস টেবিলের সাথে সম্পর্কিত।
import javax.persistence.*;
@Entity
@Table(name = "employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@Column(name = "salary")
private double salary;
// Constructors, Getters and Setters
public Employee() {}
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
এখানে:
Employee
ক্লাসটি একটি Entity এবং এটি ডেটাবেস টেবিলের সাথে সম্পর্কিত।id
ফিল্ডটি চিহ্নিত করে।JPA ব্যবহার করার সময়, Hibernate এর সেশনের পরিবর্তে EntityManager ব্যবহার করা হয় ডেটাবেস অপারেশন পরিচালনা করতে। EntityManager হল JPA এর জন্য ডেটাবেসের সাথে যোগাযোগ করার মূল API।
import javax.persistence.*;
public class JPAExample {
public static void main(String[] args) {
// EntityManagerFactory তৈরি করা
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hibernateJpa");
// EntityManager তৈরি করা
EntityManager em = emf.createEntityManager();
// Transaction শুরু করা
em.getTransaction().begin();
// Employee অবজেক্ট তৈরি করা
Employee employee = new Employee("John Doe", 50000);
// Employee অবজেক্ট সেভ করা
em.persist(employee);
// Transaction কমিট করা
em.getTransaction().commit();
// Employee অবজেক্ট রিট্রিভ করা
Employee retrievedEmployee = em.find(Employee.class, employee.getId());
System.out.println("Retrieved Employee: " + retrievedEmployee.getName());
// EntityManager বন্ধ করা
em.close();
emf.close();
}
}
এখানে:
JPA ব্যবহারের জন্য persistence.xml কনফিগারেশন ফাইল তৈরি করতে হয়, যেখানে ডেটাবেস কনফিগারেশন এবং EntityManagerFactory এর জন্য সেটিংস নির্ধারণ করা হয়। এই ফাইলটি META-INF
ডিরেক্টরিতে থাকতে হবে।
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="hibernateJpa">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>Employee</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
</properties>
</persistence-unit>
</persistence>
এখানে:
hibernateJpa
নামক একটি persistence unit তৈরি করে।Hibernate এর সাথে JPA ব্যবহার করে আপনি JPA স্পেসিফিকেশন অনুসরণ করে ডেটাবেস অপারেশনগুলো করতে পারেন। Hibernate একটি JPA implementation হিসেবে কাজ করে এবং JPA এর মাধ্যমে EntityManager এবং persistence-context ব্যবস্থাপনা করে ডেটাবেসের সাথে কার্যকরীভাবে কাজ করে। Hibernate এর সাথে JPA ব্যবহার করার জন্য আপনাকে JPA annotations এবং EntityManager ব্যবহার করতে হবে। Hibernate এই JPA স্পেসিফিকেশন অনুসরণ করে ডেটাবেস অপারেশনগুলোকে সহজ ও কার্যকরী করে তোলে, এবং আপনি Hibernate এর অতিরিক্ত বৈশিষ্ট্য যেমন caching, batch processing ইত্যাদি ব্যবহার করতে পারবেন।
JPA (Java Persistence API) একটি Java প্রযুক্তি যা ডেটাবেসের সাথে Java objects এর সম্পর্ক তৈরি এবং পরিচালনা করার জন্য ব্যবহৃত হয়। Hibernate হল একটি ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা JPA-এর এক প্রকার বাস্তবায়ন (implementation)। Hibernate JPA-এর সঙ্গে পুরোপুরি সামঞ্জস্যপূর্ণ, যার মাধ্যমে Hibernate ডেটাবেসের অপারেশনগুলি JPA এর মাধ্যমে সঞ্চালিত করতে পারে। Hibernate এবং JPA উভয়ই ডেটাবেস টেবিল এবং Java objects এর মধ্যে সম্পর্ক স্থাপন করতে ব্যবহৃত হয়, কিন্তু Hibernate JPA এর জন্য একটি শক্তিশালী বাস্তবায়ন সরবরাহ করে।
JPA এবং Hibernate এর মধ্যে সম্পর্ক এবং JPA annotations কিভাবে Hibernate এর মধ্যে ব্যবহৃত হয়, তা বোঝার জন্য নিচে বিস্তারিত আলোচনা করা হলো।
JPA ব্যবহার করার সময়, বিভিন্ন annotations ব্যবহার করা হয় যা ডেটাবেসের টেবিল এবং Java objects (Entity) এর মধ্যে সম্পর্ক নির্ধারণ করে। Hibernate JPA অ্যানোটেশনগুলির সম্পূর্ণ সাপোর্ট প্রদান করে, যার মাধ্যমে ডেটাবেস টেবিলের মধ্যে ক্লাস ও ফিল্ডের ম্যাপিং করা হয়। কিছু গুরুত্বপূর্ণ JPA অ্যানোটেশন:
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private int id;
private String name;
// Constructors, getters, setters
}
@Entity
দ্বারা নির্দেশিত ক্লাসটি ডেটাবেস টেবিলের সাথে সম্পর্কিত থাকবে এবং primary key বা unique identifier এর জন্য @Id ব্যবহৃত হয়।@Id
private int id;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Entity
@Table(name = "users")
public class User {
// fields and methods
}
@Column(name = "user_name")
private String name;
@OneToMany(mappedBy = "author")
private Set<Book> books;
author
ফিল্ডের মাধ্যমে সম্পর্ক নির্ধারণ করা হয়।@ManyToOne
@JoinColumn(name = "author_id")
private Author author;
Hibernate হল JPA এর একটি implementation, অর্থাৎ Hibernate JPA স্পেসিফিকেশন অনুসরণ করে কাজ করে, তবে Hibernate-এ কিছু অতিরিক্ত বৈশিষ্ট্য এবং ফিচার রয়েছে যা শুধুমাত্র Hibernate-এ পাওয়া যায়। Hibernate JPA এর সাথে সম্পূর্ণ সামঞ্জস্যপূর্ণ, এবং JPA অ্যানোটেশনগুলি Hibernate ব্যবহার করে entity ক্লাসগুলির মধ্যে সম্পর্ক তৈরি এবং পরিচালনা করতে ব্যবহৃত হতে পারে।
persistence.xml
ফাইলের মাধ্যমে কনফিগারেশন করা হয়।Session
API এর মাধ্যমে ট্রানজেকশন ম্যানেজমেন্ট করা হয়।Feature | JPA | Hibernate |
---|---|---|
Specification | JPA হল একটি specification (interface)। | Hibernate হল JPA এর implementation। |
Implementation | JPA এর জন্য বিভিন্ন implementations রয়েছে। | Hibernate হল JPA এর একটি জনপ্রিয় implementation। |
Annotations | JPA annotations মূলত @Entity, @OneToMany ইত্যাদি। | Hibernate একই JPA annotations সাপোর্ট করে, তবে আরও কিছু নির্দিষ্ট Hibernate annotations (যেমন @Cascade) আছে। |
Session Management | JPA EntityManager API ব্যবহার করে। | Hibernate Session API ব্যবহার করে। |
Native SQL | JPA এ শুধুমাত্র JPQL (Java Persistence Query Language) সাপোর্ট করা হয়। | Hibernate Native SQL সাপোর্ট করে, যা SQL ব্যবহার করে query লেখার সুযোগ দেয়। |
Transaction Management | JPA EntityManager এর মাধ্যমে ট্রানজেকশন পরিচালনা করা হয়। | Hibernate Session API এর মাধ্যমে ট্রানজেকশন পরিচালনা করা হয়। |
Cache | JPA এর মধ্যে cache functionality নেই, তবে হাইবারনেট এতে second level cache সমর্থন করে। | Hibernate second level cache সমর্থন করে (EHCache, OSCache)। |
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
// Constructors, getters, setters
}
Hibernate Configuration (hibernate.cfg.xml):
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<!-- Specify dialect -->
<property name="hibernate.jdbc.batch_size">50</property>
</session-factory>
</hibernate-configuration>
Hibernate JPA এর একটি শক্তিশালী implementation, যা ডেটাবেসের সাথে Java objects এর সম্পর্ক পরিচালনার জন্য JPA এর সমস্ত বৈশিষ্ট্য সাপোর্ট করে। JPA annotations Hibernate এর মধ্যে সঠিকভাবে কাজ করে এবং Hibernate ব্যবহারকারীরা JPA এর স্পেসিফিকেশন অনুসরণ করে ডেটাবেসে ইনসার্ট, আপডেট, ডিলিট এবং অন্যান্য ডেটাবেস অপারেশন সম্পাদন করতে পারে।
Hibernate এবং JPA এর মধ্যে পার্থক্য থাকলেও, Hibernate JPA স্পেসিফিকেশনকে সম্পূর্ণরূপে সাপোর্ট করে এবং একে আরও শক্তিশালী করে তোলে।
JPA Query Language (JPQL) হল একটি Object-Relational Mapping (ORM) এর জন্য তৈরি করা query language, যা Java Persistence API (JPA) এর অংশ। JPQL ব্যবহার করে আমরা Java objects এবং relational database tables এর মধ্যে সম্পর্ক অনুসন্ধান করতে পারি। JPQL SQL-এর মতো দেখতে হলেও এটি database tables এর পরিবর্তে Java objects এবং তাদের properties এর উপর ভিত্তি করে কাজ করে।
Hibernate-এ JPQL ব্যবহার করা যেতে পারে, কারণ Hibernate হল JPA implementation। Hibernate ডেটাবেসে JPQL queries সম্পাদন করতে সক্ষম, যা ডেটাবেসের সাথে সম্পর্কিত Java entities এর উপর কার্যকরী হয়।
JPQL হল SQL-এর Object-Oriented version, যা JPA তে entity objects এর উপর কাজ করে, এবং তা ডেটাবেস টেবিলগুলির পরিবর্তে Java objects ব্যবহার করে। JPQL-এ SELECT, UPDATE, DELETE, INSERT এর মতো SQL কোয়েরি কার্যকরী করা যেতে পারে।
JPQL-এর বৈশিষ্ট্য:
import javax.persistence.*;
import java.util.List;
public class JPQLExample {
public static void main(String[] args) {
// Create EntityManagerFactory and EntityManager
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("exampleUnit");
EntityManager entityManager = entityManagerFactory.createEntityManager();
try {
// Start a transaction
entityManager.getTransaction().begin();
// JPQL query to select all employees
Query query = entityManager.createQuery("SELECT e FROM Employee e");
List<Employee> employees = query.getResultList();
for (Employee employee : employees) {
System.out.println(employee.getName());
}
// Commit transaction
entityManager.getTransaction().commit();
} finally {
entityManager.close();
entityManagerFactory.close();
}
}
}
SELECT e FROM Employee e
: এই JPQL query-টি Employee
Entity class থেকে সমস্ত employee তথ্য ফিরিয়ে আনবে।e
হল alias যা Employee entity কে নির্দেশ করছে।createQuery()
method ব্যবহার করা হয়েছে JPQL query তৈরি করার জন্য, যা EntityManager
এর মাধ্যমে ডেটাবেসে execute করা হবে।JPQL-এ WHERE, JOIN, ORDER BY, GROUP BY ইত্যাদি clauses ব্যবহার করা যায়, যা SQL এর মতো কাজ করে কিন্তু Java objects-এর উপর ভিত্তি করে।
Query query = entityManager.createQuery("SELECT e FROM Employee e WHERE e.department = :department");
query.setParameter("department", "IT");
List<Employee> employees = query.getResultList();
WHERE
ক্লজ ব্যবহার করা হয়েছে যেখান থেকে IT
বিভাগের কর্মীদের তথ্য পাওয়া যাবে।Query query = entityManager.createQuery("SELECT e FROM Employee e JOIN e.department d WHERE d.name = :departmentName");
query.setParameter("departmentName", "HR");
List<Employee> employees = query.getResultList();
JOIN
ব্যবহার করা হয়েছে Employee এবং Department entity এর মধ্যে সম্পর্ক স্থাপন করার জন্য। এখানে e.department
হল Many-to-One সম্পর্ক এবং d.name দ্বারা ডিপার্টমেন্টের নাম ফিল্টার করা হয়েছে।Query query = entityManager.createQuery("SELECT e FROM Employee e ORDER BY e.salary DESC");
List<Employee> employees = query.getResultList();
ORDER BY
ক্লজ ব্যবহার করে employee.salary অনুসারে ডেটা সাজানো হয়েছে।Query query = entityManager.createQuery("SELECT d.name, COUNT(e) FROM Employee e JOIN e.department d GROUP BY d.name");
List<Object[]> result = query.getResultList();
GROUP BY
ব্যবহার করে department name অনুযায়ী কর্মচারীদের গণনা করা হয়েছে।Named Query Example:
@Entity
@NamedQuery(name = "Employee.findByDepartment", query = "SELECT e FROM Employee e WHERE e.department = :department")
public class Employee {
// Fields, constructors, getters, and setters
}
Using Named Query:
Query query = entityManager.createNamedQuery("Employee.findByDepartment");
query.setParameter("department", "IT");
List<Employee> employees = query.getResultList();
@NamedQuery
ব্যবহার করে আপনি একটি JPQL query একটি নামের সাথে সংজ্ঞায়িত করতে পারেন এবং পরে সেটি পুনরায় ব্যবহার করতে পারেন।JPQL-এ pagination করতে আপনি setFirstResult()
এবং setMaxResults()
মেথড ব্যবহার করতে পারেন।
Pagination Example:
Query query = entityManager.createQuery("SELECT e FROM Employee e");
query.setFirstResult(0); // Start from the first result
query.setMaxResults(10); // Fetch 10 results only
List<Employee> employees = query.getResultList();
JPQL-এ ডাইনামিক কোয়েরি তৈরি করতে Criteria API বা QueryBuilder ব্যবহার করা হয়।
Hibernate JPA implementation হওয়ায়, Hibernate-এ JPQL ব্যবহার করা সম্ভব। Hibernate Session এর মাধ্যমে Criteria API অথবা JPQL ব্যবহার করে query execute করা যায়।
Session session = sessionFactory.openSession();
session.beginTransaction();
// Using JPQL query
Query query = session.createQuery("SELECT e FROM Employee e WHERE e.salary > :minSalary");
query.setParameter("minSalary", 50000);
List<Employee> employees = query.getResultList();
for (Employee employee : employees) {
System.out.println(employee.getName() + ": " + employee.getSalary());
}
session.getTransaction().commit();
session.close();
createQuery()
মেথড ব্যবহার করে JPQL query তৈরি করা হয়েছে।query.setParameter()
মেথড দ্বারা প্যারামিটার সেট করা হয়েছে।getResultList()
মেথডটি query-এর ফলাফল রিটার্ন করে।Feature | JPQL | SQL |
---|---|---|
Syntax | Object-oriented, uses entities and attributes | Table-oriented, uses tables and columns |
Query Focus | Operates on Java objects (entities) | Operates on database tables |
Joins | Uses Java object relationships (e.g., @ManyToOne ) | Uses SQL joins with tables |
Use Case | Preferred for ORM-based applications with entities | Preferred for direct interaction with the database |
Performance | Slight overhead due to abstraction | More efficient for direct database access |
Read more